home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_c / cgraphix / circsegm.c < prev    next >
Text File  |  1986-05-27  |  4KB  |  185 lines

  1. /* «RM120»«PL99999»«TS4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76» */
  2. #include    <stdio.h>
  3. #define    EXTERN    extern
  4. #include    <typedef.h>
  5.  
  6.  
  7. #define    PI    3.1415298
  8.  
  9.  
  10. void ClippedLine(x1, y1, x2, y2)
  11. int        x1, y1, x2, y2;
  12. {
  13.     if (clip(&x1, &y1, &x2, &y2))
  14.         DrawLine((double)x1, (double)y1, (double)x2, (double)y2);
  15. }
  16.  
  17.  
  18. void ClippedPoint(x,y)
  19. int        x, y;
  20. {
  21.     if (ClippingGlb) {
  22.         if ((x >= X1RefGlb << 3) && (x < X2RefGlb << 3 + 7) &&
  23.             (y >= Y1RefGlb) && (y <= Y2RefGlb))
  24.             DP(x, y);
  25.     }
  26.     else
  27.         DP(x, y);
  28. }
  29.  
  30.  
  31. void DrawCircleSegment(xr0,yr0,xr1,yr1,inner,outer,phi,area,txt,option,scale)
  32. double xr0,yr0,*xr1,*yr1,inner,outer,phi,area;
  33. char    *txt;
  34. int        option, scale;
  35. {
  36.     extern double    fabs();
  37.     extern double    sin(), cos(), atan();
  38.     extern double    square(), sqrt();
  39.  
  40.  
  41.     double    FaktC,FaktS,CDummy,c,s,radius;
  42.     double    Phi1,DeltaPhi,CosPhi,SinPhi,CosDphi,SinDphi;
  43.     double    DeltaX,DeltaY,xr2,yr2,RadiusLoc,X0Loc,Y0Loc,X1Loc,Y1Loc;
  44.     int        i,AsciiCode,TextLen,n,x0,y0,x1,y1,x2,y2;
  45.     int        DirectModeLoc;
  46.     WrkString    TempText, T2Text;
  47.  
  48.     X0Loc = xr0;
  49.     Y0Loc = yr0;
  50.     X1Loc = *xr1;
  51.     Y1Loc = *yr1;
  52.     RadiusLoc = sqrt(square(X1Loc-X0Loc)+square(Y1Loc-Y0Loc));
  53.  
  54.     if (RadiusLoc <= 0.0)
  55.         return;
  56.  
  57.     option = iabs(option);
  58.     inner = fabs(inner);
  59.     outer = fabs(outer);
  60.     scale = iabs(scale);
  61.     DirectModeLoc = DirectModeGlb;
  62.     DirectModeGlb = TRUE;
  63.  
  64.     phi = phi * PI / 180.0;
  65.     if (fabs(phi)/(2.0 * PI) > 1.0)
  66.         phi = 2.0 * PI;
  67.  
  68.     n = (int)(RadiusLoc * fabs(phi) / 9.0);
  69.     if (n < 2)
  70.         n = 2;
  71.  
  72.     if ((fabs(*xr1 - xr0) > 0.) && (fabs(*yr1 - yr0) > 0.))
  73.         Phi1 = atan((*yr1 - yr0) / (*xr1 - xr0));
  74.     else {
  75.         if (*xr1-xr0 == 0.) {
  76.             if (*yr1-yr0 > 0)
  77.                 Phi1 = 0.5 * PI;
  78.             else
  79.                 Phi1 = 1.5 * PI;
  80.         }
  81.         else if (*xr1 > xr0)
  82.             Phi1 = 0.0;
  83.         else
  84.             Phi1 = PI;
  85.     }
  86.     DeltaPhi = phi/(n-1);
  87.     c = 1.0;
  88.     s = 0.0;
  89.     CosPhi = cos(Phi1);
  90.     SinPhi = sin(Phi1);
  91.     CosDphi = cos(DeltaPhi);
  92.     SinDphi = sin(DeltaPhi);
  93.     if (*xr1 < xr0) {
  94.         FaktS = -1;
  95.         FaktC = -1;
  96.     }
  97.     else {
  98.         FaktS = 1;
  99.         FaktC = 1;
  100.     }
  101.     if ((*yr1 == yr0) && (*xr1 < xr0)) {
  102.       FaktC = -FaktC;
  103.       FaktS = -FaktS;
  104.     }
  105.     if (area < 0) {
  106.         area = fabs(area);
  107.         DeltaX = FaktC * 0.3 * RadiusLoc * cos(phi / 2. + Phi1);
  108.         DeltaY = (int)(FaktS * 0.3 * AspectGlb * RadiusLoc
  109.             * sin(phi / 2. + Phi1) + 0.5);
  110.         xr0 = xr0 + DeltaX;
  111.         yr0 = yr0 + DeltaY;
  112.     }
  113.     x0 = WindowX(xr0);
  114.     y0 = WindowY(yr0);
  115.     if (!DirectModeLoc)
  116.         ClippedPoint(x0, y0);
  117.     else
  118.         DP(x0, y0);
  119.     x1 = x0;
  120.     y1 = y0;
  121.     for (i = 1; i <= n; i++ ) {
  122.         xr2 = xr0 + FaktC * RadiusLoc * (CosPhi * c - SinPhi * s);
  123.         x2 = WindowX(xr2);
  124.         yr2 = yr0 + AspectGlb * RadiusLoc * FaktS
  125.             * (SinPhi * c + CosPhi * s);
  126.         y2 = WindowY(yr2);
  127.         if (!DirectModeLoc)
  128.             ClippedLine(x1, y1, x2, y2);
  129.         else
  130.             DrawLineDirect(x1, y1, x2, y2);
  131.         x1 = x2;
  132.         y1 = y2;
  133.         CDummy = c * CosDphi - s * SinDphi;
  134.         s = s * CosDphi + c * SinDphi;
  135.         c = CDummy;
  136.     }
  137.     if (!PieGlb) {
  138.         if (!DirectModeLoc)
  139.             ClippedLine(x1, y1, x0, y0);
  140.         else
  141.             DrawLine(x1, y1, x0, y0);
  142.     }
  143.     if ((option > 0) && (phi < 2.0 * PI)) {
  144.         *xr1 = xr0 + FaktC * RadiusLoc * inner * cos(phi / 2.0 + Phi1);
  145.         *yr1 = yr0 + FaktS * AspectGlb * RadiusLoc * inner
  146.             *sin(phi/2.0+Phi1);
  147.         xr2 = xr0 + FaktC * RadiusLoc * outer * cos(phi / 2.0 + Phi1);
  148.         yr2 = yr0 + FaktS * AspectGlb * RadiusLoc * outer
  149.             * sin(phi / 2.0 + Phi1);
  150.         x1 = WindowX(*xr1);
  151.         y1 = WindowY(*yr1);
  152.         x2 = WindowX(xr2);
  153.         y2 = WindowY(yr2);
  154.         if (!DirectModeLoc)
  155.             ClippedLine(x1, y1, x2, y2);
  156.         else
  157.             DrawLineDirect( x1, y1, x2, y2);
  158.         sprintf(T2Text, "%4.2lf", area);
  159.         switch (option) {
  160.             case 1:
  161.                 strcpy(TempText, txt);
  162.                 break;
  163.  
  164.             case 2:
  165.                 strcpy(TempText, txt);
  166.                 strcat(TempText, T2Text);
  167.                 break;
  168.  
  169.             case 3:
  170.                 strcpy(TempText, T2Text);
  171.                 break;
  172.         }
  173.         TextLen = strlen(TempText);
  174.         if (x2 >= x0)
  175.             x2 = x2 + scale * 6;
  176.         else
  177.             x2 = x2 - TextLen * 6 * scale;
  178.         DrawText(x2, y2, scale, TempText);
  179.     }
  180.     *xr1 = X0Loc + FaktC * RadiusLoc * cos(phi + Phi1);
  181.     *yr1 = Y0Loc + FaktS * RadiusLoc * sin(phi + Phi1);
  182.     DirectModeGlb = DirectModeLoc;
  183. }
  184.  
  185.